/*==============================================================*/
/* Nom de SGBD :  ORACLE Version 10g                            */
/* Date de creation :  09/01/2013 08:05:00                      */
/*==============================================================*/



-- declaration de package type
create or replace package pdtypes  
as
    type ref_cursor is ref cursor;
end;

/

-- declaration du package d'integrite
create or replace package IntegrityPackage AS
 procedure InitNestLevel;
 function GetNestLevel return number;
 procedure NextNestLevel;
 procedure PreviousNestLevel;
 end IntegrityPackage;
/

-- Definition du package d'integrite
create or replace package body integritypackage as
 nestlevel number;

-- procedure d'initialisation du niveau de trigger
 procedure InitNestLevel is
 begin
 NestLevel := 0;
 end;


-- Fonction retournant le niveau d'imbrication
 function getnestlevel return number is
 begin
 if nestlevel is null then
     nestlevel := 0;
 end if;
 return(nestlevel);
 end;

-- procedure d'augmentation du niveau de trigger
 procedure nextnestlevel is
 begin
 if nestlevel is null then
     nestlevel := 0;
 end if;
 nestlevel := nestlevel + 1;
 end;

-- procedure de diminution du niveau de trigger
 procedure previousnestlevel is
 begin
 nestlevel := nestlevel - 1;
 end;

 end integritypackage;
/


drop trigger tib_fonction
/

drop trigger tib_outil
/

drop trigger tib_personnel
/

drop trigger tib_peut_utiliser
/

alter table personnel
   drop constraint fk_personne_a_pour_fo_fonction
/

alter table peut_utiliser
   drop constraint fk_peut_uti_peut_util_personne
/

alter table peut_utiliser
   drop constraint fk_peut_uti_peut_util_outil
/

drop table fonction cascade constraints
/

drop table outil cascade constraints
/

drop index a_pour_fonction_fk
/

drop table personnel cascade constraints
/

drop index peut_utiliser2_fk
/

drop index peut_utiliser_fk
/

drop table peut_utiliser cascade constraints
/

drop sequence s_fonction
/

drop sequence s_outil
/

drop sequence s_personnel
/

drop sequence s_peututiliser
/

create sequence s_fonction
/

create sequence s_outil
/

create sequence s_personnel
/

create sequence s_peututiliser
/

/*==============================================================*/
/* Table : fonction                                             */
/*==============================================================*/
create table fonction  (
   nofonction           number(6)                       not null,
   libellefonction      varchar2(80),
   constraint pk_fonction primary key (nofonction)
)
/

/*==============================================================*/
/* Table : outil                                                */
/*==============================================================*/
create table outil  (
   nooutil              number(6)                       not null,
   libelleoutil         varchar2(80),
   constraint pk_outil primary key (nooutil)
)
/

/*==============================================================*/
/* Table : personnel                                            */
/*==============================================================*/
create table personnel  (
   nopersonnel          number(6)                       not null,
   nofonction           number(6)                       not null,
   nompersonnel         varchar2(80),
   prenompersonnel      varchar2(80),
   constraint pk_personnel primary key (nopersonnel)
)
/

/*==============================================================*/
/* Index : a_pour_fonction_fk                                   */
/*==============================================================*/
create index a_pour_fonction_fk on personnel (
   nofonction asc
)
/

/*==============================================================*/
/* Table : peut_utiliser                                        */
/*==============================================================*/
create table peut_utiliser  (
   nopersonnel          number(6)                       not null,
   nooutil              number(6)                       not null,
   peututiliser         number(6)                       not null,
   constraint pk_peut_utiliser primary key (peututiliser)
)
/

/*==============================================================*/
/* Index : peut_utiliser_fk                                     */
/*==============================================================*/
create index peut_utiliser_fk on peut_utiliser (
   nopersonnel asc
)
/

/*==============================================================*/
/* Index : peut_utiliser2_fk                                    */
/*==============================================================*/
create index peut_utiliser2_fk on peut_utiliser (
   nooutil asc
)
/

alter table personnel
   add constraint fk_personne_a_pour_fo_fonction foreign key (nofonction)
      references fonction (nofonction)
/

alter table peut_utiliser
   add constraint fk_peut_uti_peut_util_personne foreign key (nopersonnel)
      references personnel (nopersonnel)
/

alter table peut_utiliser
   add constraint fk_peut_uti_peut_util_outil foreign key (nooutil)
      references outil (nooutil)
/


create trigger tib_fonction before insert
on fonction for each row
declare
    integrity_error  exception;
    errno            integer;
    errmsg           char(200);
    dummy            integer;
    found            boolean;

begin
    --  la colonne "nofonction" utilise la sequence s_fonction
    select s_fonction.nextval into :new.nofonction from dual;

--  traitement d'erreurs
exception
    when integrity_error then
       raise_application_error(errno, errmsg);
end;
/


create trigger tib_outil before insert
on outil for each row
declare
    integrity_error  exception;
    errno            integer;
    errmsg           char(200);
    dummy            integer;
    found            boolean;

begin
    --  la colonne "nooutil" utilise la sequence s_outil
    select s_outil.nextval into :new.nooutil from dual;

--  traitement d'erreurs
exception
    when integrity_error then
       raise_application_error(errno, errmsg);
end;
/


create trigger tib_personnel before insert
on personnel for each row
declare
    integrity_error  exception;
    errno            integer;
    errmsg           char(200);
    dummy            integer;
    found            boolean;

begin
    --  la colonne "nopersonnel" utilise la sequence s_personnel
    select s_personnel.nextval into :new.nopersonnel from dual;

--  traitement d'erreurs
exception
    when integrity_error then
       raise_application_error(errno, errmsg);
end;
/


create trigger tib_peut_utiliser before insert
on peut_utiliser for each row
declare
    integrity_error  exception;
    errno            integer;
    errmsg           char(200);
    dummy            integer;
    found            boolean;

begin
    --  la colonne "peututiliser" utilise la sequence s_peututiliser
    select s_peututiliser.nextval into :new.peututiliser from dual;

--  traitement d'erreurs
exception
    when integrity_error then
       raise_application_error(errno, errmsg);
end;
/

